class vector{
public:
vector(unsigned my_size): my_size(my_size), data(new double[my_size]){}
~vector(){ delete[] data; }
vector(const vector& v): my_size(v.my_size), data(new double[my_size]){
for(unsigned i=0; i<my_size; ++i) data[i]=v.data[i];
}
vector& operator=(const vector& src){
if(this==&src) return *this;
assert(my_size==src.my_size);
for(int i=0; i<my_size; ++i) data[i]=src.data[i];
return *this;
}
vector(vecot&& v): my_size(v.my_size), data(v.data){
v.data=nullptr;
v.my_size=0;
}
vector& operator=(vector&& src){
assert(my_size==0 || my_size==src.my_size);
std::swap(data, src.data);
return *this;
}
private:
unsigned my_size;
double* data;
};
int main(void){
vector v1(5);
vector v2=v1;
vector v3=vector(5);
return 0;
};
복사 생성자와 복사 할당 연산자에서 동적 메모리에 대하여 복사해야 할 경우, 깊은 복사를 구현해 주어야 함
초기화 리스트 사용하기 위한 할당 연산자
#include <initializer_list>
#include <algorithm>
class vector{
vector(std::initializer_list<double> values): my_size(values.size()), data(new double[my_size]){
std::copy(std::begin(values), std::end(values), std::begin(data));
}
vector& operator=(std::initializer_list<double>values){
assert(my_size==values.size());
std::copy(std::begin(values), std::end(values), std::begin(data));
return *this;
}
};
int main(void){
vector v1{1, 2, 3, 4, 5};
vecotr v2=v1;
}
암시적 생성 조건1. 기본 생성자
2. 기본 소멸자
3. 복사 생성자
4. 복사 대입 연산자
5. 이동 생성자
6. 이동 대입 연산자
1. 기본 생성자- 레퍼런스 타입의 멤버변수가 있으면 제거된다.(C++11부터는 default initializer로 초기화 한 경우 제외)
- const 타입의 멤버변수가 있으면 제거된다.(C++11부터는 default initializer로 초기화 한 경우 제외)
- 기본 생성자가 delete 됐거나 모호하거나 접근불가인 멤버변수가 있으면 제거된다.
- 부모클래스의 기본 생성자가 delete 됐거나, 모호하거나 접근 불가이면 제거된다.
- 부모 클래스의 소멸자가 delete 됐거나, 접근불가이면 제거된다.
2. 기본 소멸자- 비정적 멤버변수의 소멸자가 delete됐거나, 접근불가이면 제거된다.
- 부모 클래스의 소멸자가 delete 됐거나, 접근불가이면 제거된다.
- 부모 클래스가 가상 소멸자를 가지고 있을 때,
operator delete()가 delete 됐거나, 모호하거나, 접근불가이면 제거된다.
3. 복사 생성자- 비정적 멤버변수가 복사될 수 없으면 제거된다.(delete, 모호, 접근 불가)
- 부모 클래스가 복사될 수 없으면 제거된다.
- 부모 클래스의 소멸자가 delete 됐거나, 접근불가이면 제거된다.
- 직접 정의한 이동생성자나 이동 대입 연산자가 있으면 암시적 생성이 안된다.(C++11)
- Rvalue 레퍼런스 멤버변수가 있으면 암시적 생성이 안된다.(C++11)
4. 복사 대입 연산자- 직접 정의한 이동 생성자나 이동 대입 연산자가 있으면 암시적 생성이 안된다.(C++11)
- const 타입의 비정적 멤버변수가 있으면 제거된다.
- 레퍼런스 타입의 비정적 멤버변수가 있으면 제거된다.
- 부모 클래스의 복사 대입 연산자가 호출될 수 없으면 제거된다.
5. 이동 생성자- 직접 정의한 복사 생성자나 복사 대입 연산자나 이동 대입 연산자나 소멸자가 있으면 암시적 생성이 안된다.
- 비정적 멤버변수가 이동될 수 없으면 제거된다.
- 부모 클래스가 이동될 수 없으면 제거된다.
- 부모 클래스의 소멸자가 delete됐거나, 접근불가이면 제거된다.
6. 이동 대입 연산자- 직접 정의한 복사 생성자나 복사 대입 연산자나 이동 생성자가 있으면 암시적 생성이 안된다.
- const 타입의 비정적 멤버변수가 있으면 제거된다.
- 레퍼런스 타입의 비정적 멤버변수가 있으면 제거된다.
- 비정적 멤버변수가 이동될 수 없으면 제거된다.(delete, 모호, 접근불가)
- 부모 클래스가 이동될 수 없으면 제거된다.(delete, 모호, 접근불가)
암시적 생성조건이 어긋나게 될 경우, =default 키워드를 사용하면, 강제할 수 있다.